package controllers;

import java.io.*;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import models.User;
import models.Roll;
import models.UserForm;
import models.UserValidator;

public class GebruikerWijzigController extends HttpServlet
{

    private static String titelNieuw = "Nieuwe gebruiker"; //Titel voor de Nieuwe gebruiker pagina
    private static String titelWijzig = "Wijzigen gebruiker"; //Titel voor de Wijzig gebruiker pagina

    /*
     * HTTP GET request
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException
    {
        HttpSession sessie = request.getSession(); //Haalt gegevens uit de sessie op.
        LinkedList<Roll> rollen = new LinkedList(); //Maakt nieuwe LinkedList aan voor het opslaan van de gebruikers.
        if (sessie.getAttribute("rollen") != null)
        {
            rollen = (LinkedList) sessie.getAttribute("rollen"); //Haalt de huidige lijst met gebruikers op uit de sessie.
        }
        request.setAttribute("rollenUitSessie", rollen);
        if (request.getParameter("id") != null)
        {
            //Als er een id is meegegeven, worden de gegevens van de gebruiker opgehaald.
            long id = Long.parseLong(request.getParameter("id"));
            request.setAttribute("id", id);

            LinkedList gebruikers = (LinkedList) sessie.getAttribute("gebruikers"); //Haalt de lijst met gebruikers op en slaat deze op in een LinkedList


            for (int i = 0; i < gebruikers.size(); i++)
            {
                User tempGebruiker = (User) gebruikers.get(i);

                //Als de gebruiker overeenkomt met het gegeven id, worden de gegevens ingevuld in het formulier.
                if (tempGebruiker.getCustomerNumber() == id)
                {
                    request.setAttribute("naam", tempGebruiker.getName());
                    request.setAttribute("adres", tempGebruiker.getStreetAddress());
                    request.setAttribute("plaats", tempGebruiker.getCity());
                    request.setAttribute("huisnummer", tempGebruiker.getHuisnummer());
                    request.setAttribute("rolnummer", tempGebruiker.getRoll());
                }
            }
            doorsturen(request, response, titelWijzig); //Stuurt door naar de Wijzig gebruiker pagina.
        } else
        {

            doorsturen(request, response, titelNieuw); //Stuurt door naar de Nieuwe gebruiker pagina.
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException
    {
        long id = 0;
        String titel = new String();
        String naam = new String();
        String adres = new String();
        String plaats = new String();
        String huisnummer = new String();
        long rolnummer = 0;

        String uri = request.getRequestURI();

        int lastIndex = uri.lastIndexOf("/");
        String action = uri.substring(lastIndex + 1);
        String dispatchUrl = null;
        UserForm userform = new UserForm();
            // populate action properties
            userform.setName(request.getParameter("naam"));
            userform.setStreetAddress(request.getParameter("straatnaam"));
            userform.setCity(request.getParameter("plaats"));
            userform.setHuisnummer(request.getParameter("huisnummer"));
        if (action.equals("product_input"))
        {
            // no action class, there is nothing to be done
            dispatchUrl = "/ProductForm.jsp";
        } else if (action.equals("nieuw"))
        {
            // instantiate action class
            

            // validate ProductForm
            UserValidator productValidator = new UserValidator();
            List<String> errors = productValidator.validate(userform);
            if (errors.isEmpty())
            {
                if (request.getParameter("id") != null)
                {
                    id = Long.parseLong(request.getParameter("id"));
                }
                if (request.getParameter("naam") != null)
                {
                    naam = request.getParameter("naam");
                }
                if (request.getParameter("straatnaam") != null)
                {
                    adres = request.getParameter("straatnaam");
                }
                if (request.getParameter("plaats") != null)
                {
                    plaats = request.getParameter("plaats");
                }
                if (request.getParameter("huisnummer") != null)
                {
                    huisnummer = request.getParameter("huisnummer");
                }
                if (request.getParameter("rolnummer") != null)
                {
                    rolnummer = Long.parseLong(request.getParameter("rolnummer"));
                }
                HttpSession sessie = request.getSession(); //Haalt de gegevens uit de sessie op.
                LinkedList<User> gebruikers = new LinkedList(); //Maakt nieuwe LinkedList aan voor het opslaan van de gebruikers.
                LinkedList<Roll> rollen = new LinkedList(); //Maakt nieuwe LinkedList aan voor het opslaan van de gebruikers.
                if (sessie.getAttribute("rollen") != null)
                {
                    rollen = (LinkedList) sessie.getAttribute("rollen"); //Haalt de huidige lijst met gebruikers op uit de sessie.
                }
                if (sessie.getAttribute("gebruikers") != null)
                {
                    gebruikers = (LinkedList) sessie.getAttribute("gebruikers"); //Haalt de huidige lijst met gebruikers op uit de sessie.
                }

                //Als er een id is meegestuurd, wordt de gebruiker geupdate.
                if (id != 0)
                {
                    LinkedList<User> tempGebruikers = new LinkedList();

                    for (int i = 0; i < gebruikers.size(); i++)
                    {
                        User tempGebruiker = (User) gebruikers.get(i);

                        //Als de gebruiker overeenkomt met het gegeven id, wordt de gebruiker geupdate.
                        if (tempGebruiker.getCustomerNumber() == id)
                        {
                            tempGebruiker.setName(naam);
                            tempGebruiker.setStreetAddress(adres);
                            tempGebruiker.setCity(plaats);
                            tempGebruiker.setHuisnummer(huisnummer);
                            tempGebruiker.setRoll(rolnummer);

                        }
                        tempGebruikers.add(tempGebruiker);
                    }
                    gebruikers = tempGebruikers;
                } else
                {//Anders wordt de gebruiker aangemaakt.
                    long uniekId = System.nanoTime();
                    User gebruiker = new User(uniekId, naam, adres, plaats, huisnummer, rolnummer);
                    gebruikers.add(gebruiker);
                }

                sessie.setAttribute("gebruikers", gebruikers);
                sessie.setAttribute("rollenUitSessie", rollen);

                response.sendRedirect("../gebruikers"); //Stuurt door naar de Gebruikers index
            } else
            {
                request.setAttribute("errors", errors);
                request.setAttribute("form", userform);
                dispatchUrl = "/gebruiker_wijzigen.jsp";
            }
        }

        // forward to a view
        if (dispatchUrl != null)
        {
            RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl);
            rd.forward(request, response);
        }



        //Als de boolean nog steeds true is, kan er verder worden gegaan met het opslaan van de gebruiker

    }

    private void doorsturen(HttpServletRequest request, HttpServletResponse response, String titel)
            throws ServletException, IOException
    {

        request.setAttribute("paginaTitel", titel);

        String address = "/gebruiker_wijzigen.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(address);
        dispatcher.forward(request, response);
    }
}
